package model;

import java.io.UnsupportedEncodingException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;

import org.apache.commons.codec.digest.DigestUtils;

import model.db.MyDBAccess;

public class InputCheck {
	private String employee_no = "";
	private String check_emp_no = "";
	private String password = "";
	private String password_again = "";
	private String first_name = "";
	private String last_name = "";
	private String sex = "";
	private String join_date = "";
	private String join_date_from = "";
	private String join_date_to = "";
	private String section = "";
	private String mail = "";
	{

	}

	// 新規登録入力項目チェックのコンストラクタ
	public InputCheck(String emp_no, String pw, String pw_again, String f_name,
			String l_name, String sex1, String j_date, String sec, String mail1) {
		// 変数の初期化
		employee_no = emp_no;
		password = pw;
		password_again = pw_again;
		first_name = f_name;
		last_name = l_name;
		sex = sex1;
		join_date = j_date;
		section = sec;
		mail = mail1;
	}

	// ログイン入力項目チェックのコンストラクタ
	public InputCheck(String emp_no, String pw) {
		// 変数の初期化
		employee_no = emp_no;
		password = pw;
	}

	// 検索入力項目チェックのコンストラクタ
	public InputCheck(String emp_no, String sex1, String j_date_from,
			String j_date_to, String sec) {
		// 変数の初期化
		employee_no = emp_no;
		sex = sex1;
		join_date_from = j_date_from;
		join_date_to = j_date_to;
		section = sec;
	}

	// /////////////////////////////////////////////////////////////////////////登録
	// 空欄チェック
	public void check_null() throws InputException {
		if ("".equals(employee_no) || "".equals(password)
				|| "".equals(password_again) || "".equals(first_name)
				|| "".equals(last_name) || "".equals(sex)
				|| "".equals(join_date) || "".equals(section)) {
			throw new InputException("空欄有り", InputException.BLANK_ID);
		}
	}

	// 文字数チェック
	public void check_txtlength() throws InputException {
		if (employee_no.length() != 5 || password.length() > 64
				|| password_again.length() > 64 || first_name.length() > 32
				|| last_name.length() > 32 || sex.length() != 1
				|| join_date.length() != 8 || section.length() != 3
				|| mail.length() > 256) {
			throw new InputException("文字数エラー", InputException.INVALID_INPUT);
		}
	}

	// 確認パスワードチェック
	public void check_passagain() throws InputException {
		if (password.length() != password_again.length()) {
			throw new InputException("確認パスワードエラー", InputException.INVALID_INPUT);
		}
	}

	// パスワード形式チェック（全角チェック）
	public void check_pass_form() throws InputException {
		byte[] check_password = null;
		try {
			check_password = password.getBytes("SJIS");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		if (password.length() != check_password.length) {
			throw new InputException("パスワード形式エラー", InputException.INVALID_INPUT);
		}
	}

	// 入社年月日の形式チェック（全角チェック）
	public void check_joindate_form() throws InputException {
		byte[] check_join_date = null;
		try {
			check_join_date = join_date.getBytes("SJIS");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		if (join_date.length() != check_join_date.length) {
			throw new InputException("入社年月日形式エラー", InputException.INVALID_INPUT);
		}
	}

	// 実在日チェック
	public void check_joindate() throws InputException {
		DateFormat format = DateFormat.getDateInstance();
		format.setLenient(false);
		StringBuilder sb = new StringBuilder();
		sb.append(join_date);
		sb.insert(4, "/");
		sb.insert(7, "/");
		try {
			format.parse(new String(sb));
		} catch (Exception e) {
			throw new InputException("実在日エラー", InputException.INVALID_INPUT);
		}
	}

	// 入社年月日の形式チェック
	public void check_joindate_form2() throws InputException {
		if ("0".equals(join_date.substring(0, 1))) {
			throw new InputException("入社年月日形式エラー", InputException.INVALID_INPUT);
		}
	}

	// 社員番号重複チェックv
	public void check_same_empno() throws InputException, DBException {

		MyDBAccess db = new MyDBAccess();
		try {
			db.open();
		} catch (Exception e) {
			throw new DBException("データベースオープンエラー", DBException.DB_OPEN_ERR);
		}
		// 内容: データベースにアクセスする
		// MyDBAccess のインスタンスを生成する
		String sql = "select employee_no from employee_info where employee_no = \'"
				+ employee_no + "\';";
		ResultSet rs = null;
		try {
			rs = db.getResultSet(sql);
		} catch (Exception e) {
			throw new DBException("データベースからデータを取り出せないエラー",
					DBException.DB_RESULT_NOTHING);
		}
		try {
			while (rs.next()) {
				check_emp_no = rs.getString("employee_no");
			}
		} catch (SQLException e) {
			throw new DBException("resultを読めないエラー",
					DBException.DB_RESULT_NOTREAD);
		}
		if (employee_no.equals(check_emp_no)) {
			throw new InputException("社員番号重複エラー", InputException.DUPLICATE_ID);
		}
	}

	// ///////////////////////////////////////////////////////////ログイン
	// 空欄チェック
	public void check_null_login() throws InputException {
		if ("".equals(employee_no) || "".equals(password)) {
			throw new InputException("空欄有り", InputException.BLANK_ID);
		}
	}

	// パスワードチェック
	public String check_password() throws InputException, DBException {
		String code_pass = "";
		String fullname = "";

		MyDBAccess db = new MyDBAccess();
		// データベースへのアクセス
		try {
			db.open();
		} catch (Exception e) {
			throw new DBException("データベースオープンエラー", DBException.DB_OPEN_ERR);
		}
		// 内容: データベースにアクセスする
		// MyDBAccess のインスタンスを生成する
		String sql = "select employee_no ,password , first_name , last_name from employee_info where employee_no = \'"
				+ employee_no + "\';";
		ResultSet rs = null;
		try {
			rs = db.getResultSet(sql);
		} catch (Exception e2) {
			throw new DBException("データベースからデータを取り出せないエラー",
					DBException.DB_RESULT_NOTHING);
		}
		try {
			while (rs.next()) {
				code_pass = rs.getString("password");
				fullname = rs.getString("first_name");
				fullname += "　";
				fullname += rs.getString("last_name");
			}

		} catch (SQLException e2) {
			throw new DBException("resultを読めないエラー",
					DBException.DB_RESULT_NOTREAD);
		}
		if (code_pass == null || "".equals(code_pass)) {
			throw new DBException("resultを読めないエラー",
					DBException.DB_RESULT_NOTREAD);
		}
		// 入力されたパスワードをハッシュ化
		else if (code_pass.equals(DigestUtils.sha256Hex(password)) == false) {
			throw new InputException("パスワード入力エラー", InputException.INVALID_INPUT);
		}
		// DBクローズ
		try {
			db.close();
		} catch (Exception e) {
			throw new DBException("データベースクローズエラー", DBException.DB_CLOSE_ERR);
		}
		return fullname;
	}

	// ////////////////////////////////////////////////////////検索
	// 検索条件の有無チェック
	public boolean searchcondition() {
		if ((employee_no == null || employee_no.length() < 1)
				&& (sex == null || sex.compareTo("null") == 0)
				&& (join_date_from == null || join_date_from == "")
				&& (join_date_to == null || join_date_to == "")
				&& (section == null || section.compareTo("null") == 0)) {
			return false;
		}
		return true;
	}
}
